#include <HardwareSerial.h>

#define PACKET_HEADER 0xAA
#define PACKET_FOOTER 0xFF

// HardwareSerial Serial2(2);  // 使用UART2（ESP32）

uint8_t rx_buffer[256];  // 接收缓冲区
uint8_t data_len = 0;    // 数据长度
bool receiving = false;  // 是否正在接收数据

String packDataWithPadding(const String& data) {
  // 计算基础长度（包头1 + 长度1 + 数据 + 包尾1）
  size_t baseLength = 3 + data.length();
  
  // 计算需要的填充字节数
  size_t paddingNeeded = (4 - (baseLength % 4)) % 4;
  
  // 构建数据包
  String packet;
  packet.reserve(baseLength + paddingNeeded); // 预分配空间提高效率
  
  // 添加包头
  packet += (char)0xAA;
  
  // 添加数据长度（注意限制长度不超过255）
  packet += (char)(data.length() & 0xFF);
  
  // 添加数据
  packet += data;
  
  // 添加填充和包尾
  if (paddingNeeded == 0) {
    packet += (char)0xFF;
    packet += (char)0xFF; // 添加额外填充确保总长度不是4的倍数
  } else {
    packet += (char)0xFF; // 包尾
    // 不需要额外填充，因为baseLength + 1已经不是4的倍数
  }
  
  return packet;
}


void setup() {
  Serial.begin(115200);                       // 调试输出
  Serial2.begin(115200, SERIAL_8N1, 16, 17);  // RX=16, TX=17
  Serial.println("UART Protocol Receiver Ready");
}

uint8_t i = 0;
void loop() {

String send_str="+01,009,f";
String pack=packDataWithPadding(send_str);

  Serial2.print(pack);
  Serial.println(pack);
  delay(500);



  if (Serial2.available()) {
    uint8_t byte = Serial2.read();

    if (byte == PACKET_HEADER && !receiving) {
      // 检测到包头，开始接收
      receiving = true;
      data_len = 0;
      Serial.println("[Header Detected]");
    } else if (receiving) {
      if (data_len == 0) {
        // 第一个字节是数据长度
        data_len = byte;
        Serial.print("[Data Length]: ");
        Serial.println(data_len);
      } else if (data_len > 0 && data_len <= sizeof(rx_buffer)) {
        // 存储数据
        static uint8_t idx = 0;
        rx_buffer[idx++] = byte;

        if (idx == data_len) {
          // 数据接收完成，检查包尾
          if (Serial2.read() == PACKET_FOOTER) {
            Serial.println("[Packet Received]");
            Serial.print("Data: ");
            for (int i = 0; i < data_len; i++) {
              Serial.printf("%c", rx_buffer[i]);
            }
            Serial.println();
          } else {
            Serial.println("[Error: Invalid Footer]");
          }
          // 重置状态
          receiving = false;
          idx = 0;
        }
      } else {
        // 数据长度超出缓冲区
        Serial.println("[Error: Data Too Long]");
        receiving = false;
      }
    }
  }
}